

//155. 最小栈
//设计一个支持 push ，pop ，top 操作，并能在常数时间内检索到最小元素的栈。
//push(x) —— 将元素 x 推入栈中。
//pop() —— 删除栈顶的元素。
//top() —— 获取栈顶元素。
//getMin() —— 检索栈中的最小元素。
//示例 :
//输入：
//["MinStack", "push", "push", "push", "getMin", "pop", "top", "getMin"]
//[[], [-2], [0], [-3], [], [], [], []]
//输出：
//[null, null, null, null, -3, null, 0, -2]
//解释：
//MinStack minStack = new MinStack();
//minStack.push(-2);
//minStack.push(0);
//minStack.push(-3);
//minStack.getMin();   --> 返回 - 3.
//minStack.pop();
//minStack.top();      --> 返回 0.
//minStack.getMin();   --> 返回 - 2.
//提示：
//pop、top 和 getMin 操作总是在 非空栈 上调用。




#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <queue>
#include <stack> 
#include <map> 
#include <string>
#include <unordered_map>
#include <unordered_set>
using namespace std;




class MinStack {
private:
    stack<int> sta;
    stack<int> minsta;
public:
    MinStack() {

    }

    void push(int x) {
        sta.push(x);
        if (minsta.empty())
            minsta.push(x);
        else
            minsta.push(min(minsta.top(), x));
    }

    void pop() {
        sta.pop();
        minsta.pop();
    }

    int top() {
        return sta.top();
    }

    int getMin() {
        return minsta.top();
    }
};

int main()
{
    MinStack minStack = MinStack();
    minStack.push(-2);
    minStack.push(0);
    minStack.push(-1);
    minStack.getMin(); 
    minStack.top();
    minStack.pop();
    int res = minStack.getMin();   

    cout << res << endl;
    system("pause");

    return 0;
}











